package com.hspedu.reflection;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author DL5O
 * @version 1.0
 */
public class Reflection01 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Properties properties = new Properties();
        String filePath = "src\\re.properties";
        properties.load(new FileReader(filePath));

        String classFullPath = properties.getProperty("classfullpath");
        String method = properties.getProperty("method");


        //先加载类对象
        Class<?> cls = Class.forName(classFullPath);
        Object o = cls.newInstance();//得到该对象的实例
        Method method1 = cls.getMethod(method);//得到该对象的 cry(可以根据配置文件来进行更改)方法
        //调用method1方法
        method1.invoke(o);

        //java.lang.reflect.Field:代表类的成员变量, Field对象表示某个类的成员变量
        //得到name字段
        //getField 不能得到私有的属性
        Field nameFile = cls.getField("age");
        System.out.println(nameFile.get(o));//传统写法 对象.成员变量，反射：成员变量对象.get(对象)

        //java.lang.reflect.Constructor:代表类的构造方法, Constructor对象表示构造器
        Constructor constructor = cls.getConstructor();//()可以指定够着起参数类型，返回的是无参购货周期
        System.out.println(constructor);//public com.hspedu.Cat()

        Constructor constructor2 = cls.getConstructor(String.class);//这里String.class，就是String类的class对象
        System.out.println(constructor2);//public com.hspedu.Cat(java.lang.String)
    }
}
